package com.soyorin.shop.config;

import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Configuration;

/**
 * 商铺模块配置类
 * 展示低耦合的配置管理
 * 
 * @author soyorin
 * @version 1.0
 * @since 2024-01-01
 */
@Configuration
@ConfigurationProperties(prefix = "shop")
@Data
public class ShopConfig {

    /**
     * 分页配置
     */
    private PageConfig page = new PageConfig();

    /**
     * 地理位置配置
     */
    private LocationConfig location = new LocationConfig();

    /**
     * 缓存配置
     */
    private CacheConfig cache = new CacheConfig();

    /**
     * 业务规则配置
     */
    private BusinessConfig business = new BusinessConfig();

    /**
     * 分页配置
     */
    @Data
    public static class PageConfig {
        /**
         * 默认分页大小
         */
        private int defaultPageSize = 10;

        /**
         * 最大分页大小
         */
        private int maxPageSize = 100;

        /**
         * 是否启用合理化分页
         */
        private boolean reasonable = true;
    }

    /**
     * 地理位置配置
     */
    @Data
    public static class LocationConfig {
        /**
         * 默认配送半径（公里）
         */
        private double defaultDeliveryRadius = 5.0;

        /**
         * 最大配送半径（公里）
         */
        private double maxDeliveryRadius = 20.0;

        /**
         * 距离计算精度
         */
        private int distancePrecision = 2;

        /**
         * 是否启用地理位置缓存
         */
        private boolean enableLocationCache = true;
    }

    /**
     * 缓存配置
     */
    @Data
    public static class CacheConfig {
        /**
         * 商铺信息缓存过期时间（分钟）
         */
        private int shopExpireMinutes = 30;

        /**
         * 统计信息缓存过期时间（分钟）
         */
        private int statisticsExpireMinutes = 60;

        /**
         * 地理位置缓存过期时间（分钟）
         */
        private int locationExpireMinutes = 15;

        /**
         * 是否启用缓存
         */
        private boolean enabled = true;
    }

    /**
     * 业务规则配置
     */
    @Data
    public static class BusinessConfig {
        /**
         * 最小商铺名称长度
         */
        private int minShopNameLength = 2;

        /**
         * 最大商铺名称长度
         */
        private int maxShopNameLength = 64;

        /**
         * 最小配送费用（分）
         */
        private int minDeliveryFee = 0;

        /**
         * 最大配送费用（分）
         */
        private int maxDeliveryFee = 5000;

        /**
         * 最小订单金额（分）
         */
        private int minOrderAmount = 0;

        /**
         * 评分范围最小值
         */
        private double minRating = 0.0;

        /**
         * 评分范围最大值
         */
        private double maxRating = 5.0;

        /**
         * 是否启用自动评分更新
         */
        private boolean enableAutoRatingUpdate = true;

        /**
         * 是否启用营业时间验证
         */
        private boolean enableBusinessHoursValidation = true;
    }

    /**
     * 获取默认分页大小
     */
    public int getDefaultPageSize() {
        return page.getDefaultPageSize();
    }

    /**
     * 获取最大分页大小
     */
    public int getMaxPageSize() {
        return page.getMaxPageSize();
    }

    /**
     * 获取默认配送半径
     */
    public double getDefaultDeliveryRadius() {
        return location.getDefaultDeliveryRadius();
    }

    /**
     * 获取商铺缓存过期时间
     */
    public int getShopCacheExpireMinutes() {
        return cache.getShopExpireMinutes();
    }

    /**
     * 验证商铺名称长度
     */
    public boolean isValidShopNameLength(String shopName) {
        if (shopName == null) {
            return false;
        }
        int length = shopName.trim().length();
        return length >= business.getMinShopNameLength() && 
               length <= business.getMaxShopNameLength();
    }

    /**
     * 验证配送费用
     */
    public boolean isValidDeliveryFee(int deliveryFee) {
        return deliveryFee >= business.getMinDeliveryFee() && 
               deliveryFee <= business.getMaxDeliveryFee();
    }

    /**
     * 验证评分
     */
    public boolean isValidRating(double rating) {
        return rating >= business.getMinRating() && 
               rating <= business.getMaxRating();
    }

    /**
     * 验证订单金额
     */
    public boolean isValidOrderAmount(int orderAmount) {
        return orderAmount >= business.getMinOrderAmount();
    }
}
